package top.kiterunner.learning.concurrency_test;

import java.util.concurrent.TimeUnit;

/**
 * AdorynZhao in Tencent-UESTC.
 * Source Code Created on 2017/7/6.
 */
public class ThreadDemo11 {
    public Object lock = new Object();

    public void method() {
        synchronized (lock) {
            while (true) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println(Thread.currentThread().getName());
            }
        }
    }

    public static void main(String[] args) {
        ThreadDemo11 t11 = new ThreadDemo11();

        Thread thread1 = new Thread(t11::method, "Thread1");
        thread1.start();

        Thread thread2 = new Thread(t11::method, "Thread2");
        thread2.start();

        // 取消和注释该语句，分析为什么会出现这种情况！！
        // 原因很简单：取得的锁是存在堆中的对象锁，而不是栈中的对象引用。所以当进行对象引用指向其他时，仍然能够获取到锁。
        // 这个锁不再是以前对象的锁了，而是一个新对象的锁。
        t11.lock = new Object();
    }
}
